home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / comm / misc / zvm1_25.lha / alertmessages.zvm next >
Text File  |  1993-09-27  |  13KB  |  477 lines

  1. /*alertmessages.zvm*/
  2. /* DANGER!!! DO NOT EDIT ANYTHING THAT IS NOT PART OF THE USER-CODE SECTION!!! */
  3.  
  4. /* THIS PART IS INCLUDED FROM INCLUDEH.ZVM.  DO NOT EDIT THIS PART.  LOOK FOR
  5.    THE SECTION WHICH SAYS USER CODE SECTION.  YOU HAVE BEEN WARNED!
  6.     
  7.    V1.00
  8. */
  9.  
  10. /* we want results! */
  11. options results
  12.  
  13. /* We want to trap on these things, to help us debug.  The definitions for
  14.    these are in INLCUDET.ZVM
  15. */
  16.  
  17. signal on halt
  18. signal on novalue
  19. signal on syntax
  20. signal on break_c
  21.  
  22. /* Set up modem stuff */
  23. call doInitializations
  24.  
  25. /* We are about to start the user code section.  Any function that you
  26.    write that has a PROCEDURE statement NEEDS to have an EXPOSE MODE. STATUS.
  27.    for my stub functions to work.
  28. */
  29. /*vvvvvvvvvvvvvvvvvvvvvvvvBEGINNING OF USER CODEvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  30.  
  31.  
  32. /* This is called when there are messages or faxes waiting */
  33. /* Called with args:  numVoiceMessages */
  34.  
  35. parse arg numVoiceMessages .
  36.  
  37. if (numVoiceMessages = 1) then address command 'say "you have a message."'
  38.  
  39. if (numVoiceMessages > 1) then address command 'say "you have' numVoiceMessages 'messages."'
  40.  
  41. exit
  42.  
  43. /*^^^^^^^^^^^^^^^^^^^^^^^^^^END OF USER CODE^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  44. /*-------------------------------HANDS OFF--------------------------------*/
  45. /* DON'T TOUCH THIS STUFF.  IF YOU FIX SOMETHING HERE, TELL ME ABOUT IT   */
  46. /* 
  47.     HISTORY
  48.  
  49.     V1.32    - Added getoption, readoptions, setserial
  50.     V1.31    - Fixed debugger stuff (no value)
  51.     V1.30    - Added debugger stuff
  52.     V1.29    - Fixed type. and log. problem not being exposed
  53.         - Fixed filetype function
  54.     V1.28    - Fixed a problem in callup.  Maybe related to 5.02 roms
  55.     V1.27    - Added filetype rexx function to determine the type
  56.         of a file
  57.     V1.26   - Added some more rexx functions to interface with ZVM
  58.         - Added the callup function to dial a telephone number
  59.     V1.25     - Fixed getnumvoicemessages
  60.     V1.24    - Added requiremode, assumemode, etc.
  61.     V1.23    - Changed the way type and status are handled and added
  62.         a new argument to the get and set stuff (namely, the log number)
  63.         - Also changed to setLogEntryVariable and getLogEntryVariable
  64.         instead of the numerous functions we had before
  65.     V1.22 - Added stuff to make it more programmable
  66. */
  67.  
  68. exit
  69.  
  70. getOption: procedure expose options.
  71.     parse upper arg optionName
  72.     return options.optionName
  73.  
  74. readOptions: procedure expose options.
  75.     firstLine = sourceline(1)
  76.     parse var firstLine '/*' title '.'
  77.     optionsFileName = title || '.options'
  78.     if exists(optionsFileName) then do
  79.         call open('options', optionsFileName, 'r')
  80.         do while ~eof('options')
  81.             line = readln('options')
  82.             parse upper var line variable '=' value
  83.             options.variable = value
  84.         end
  85.         call close('options')
  86.     end
  87.  
  88.     return
  89.  
  90. /* this function dials a number and returns status.normal
  91.     if someone picks up the phone that was called.  It returns
  92.     other types of errors otherwise.
  93. */
  94.  
  95. callup: procedure expose status. mode. device.
  96.     parse arg telephoneNumber
  97.     
  98.     /* should do an at+fclass=8 */
  99.     status = requireMode(mode.voiceMode)
  100.     if status ~= status.normal then return status
  101.  
  102.     status = writeLine('ATD' telephoneNumber)
  103.     if status ~= status.normal then return status
  104.  
  105.     /* this should swallow the thing we just sent out */
  106.     status = readLine(60) /* 60 second timeout */
  107.     if status ~= status.normal then return status
  108.  
  109. ringing:
  110.     status = readLine(60) /* 60 second timeout */
  111.     if status ~= status.normal then return status
  112.  
  113.     /* line should have the line we want */
  114.     if line = 'VCON' then do
  115.         /* removed the next line because even though we received
  116.             a VCON, it doesn't go into voicemode */
  117.         call requireDevice(device.telephoneLine)
  118.         /*
  119.         call assumeMode(mode.connectedMode)
  120.         */
  121.         return status.normal
  122.     end
  123.  
  124.     if line = 'RINGING' then signal ringing
  125.     if line = 'NO CARRIER' then return status.busydetected
  126.     if line = '' then signal ringing
  127.     if line = 'NO DIALTONE' then do
  128.         call showDebugger("I couldn't detect the dialtone")
  129.         return status.busydetected
  130.     end
  131.  
  132.     return status.busyDetected
  133.  
  134. /* This function gives you a simple way of presenting an N key menu
  135.     to the caller
  136.  
  137.     ARGS:  numKeys choiceFileName badChoiceFileName timeOut validChoices
  138.     numBadChoices
  139.  
  140.     numKeys = number of keys wanted
  141.     choiceFileName = file name of the menu
  142.     badChoiceFileName = what to say if caller enters a bad choice
  143.     timeOut = number of seconds allowed before timing out
  144.     validChoices = list of characters that are valid choices
  145.     numBadChoices = number of times you want to present the menu before exiting
  146.  
  147.     RETURNS:  status, choice = valid key
  148. */
  149.  
  150. presentMenu: procedure expose choice status. mode.
  151.     parse arg numKeys,choiceFileName,badChoiceFileName,timeOut,validChoices,numBadChoices .
  152.  
  153.     timesAround = numBadChoices;
  154.  
  155.     do timesAround = numBadChoices to 1 by -1
  156.         status = playVoice(choiceFileName)
  157.  
  158.         if status > status.keyDetected then signal presentMenuDone;
  159.  
  160.         status = readNKeys(numKeys, timeOut)
  161.  
  162.         if status = status.timedOut then do
  163.             call flushPhoneBuffer()
  164.             status = playVoice('voice:voices/Timed Out')
  165.             iterate
  166.         end
  167.         if status ~= status.normal then signal presentMenuDone;
  168.  
  169.         choice = keys
  170.         if pos(choice, validChoices) = 0 then do
  171.             call flushPhoneBuffer()
  172.             status = playVoice(badChoiceFileName)
  173.             iterate
  174.         end
  175.  
  176.         return status.normal
  177.     end
  178.  
  179.     status = status.timedOut
  180. presentMenuDone:
  181.     return status
  182.  
  183. /*----------------------------------------------------------------------*/
  184. /*    Here are the encapsulated functions.  They're responsible for
  185.     communicating with ZVM.  Don't edit or touch them, except for
  186.     bug fixes.
  187. */
  188.  
  189. playVoice:  procedure expose status. mode.
  190.     parse arg fileName
  191.     address voicemail1 'playVoice' fileName
  192.     if rc >= status.busyDetected then
  193.         call showDebugger('playVoice' rc)
  194.     return rc
  195.  
  196. /* this returns a handle to the newly created log entry */
  197. addLogEntry: procedure expose status. mode.
  198.     if arg() ~= 1 then do
  199.         say 'Bad arguments to addLogEntry'
  200.         return 20
  201.     end
  202.     parse arg logNumber
  203.     address voicemail1 'addLogEntry' logNumber
  204.     return result
  205.  
  206. setLogEntryVariable: procedure expose status. mode.
  207.     if arg() ~= 4 then do
  208.         say 'Bad arguments to setLogEntryVariable'
  209.         return 20
  210.     end
  211.     parse arg variable, logNumber, logEntryNumber, logEntryValue
  212.     address voicemail1 'setLogEntryVar' variable ',' || logNumber || ',' || logEntryNumber || ',' || logEntryValue
  213.     return rc
  214.  
  215. getLogEntryVariable: procedure expose status. mode.
  216.     if arg() ~= 3 then do
  217.         say 'Bad arguments to getLogEntryVariable'
  218.         return 'BADBADBAD'
  219.     end
  220.     parse arg variable, logNumber, logEntryNumber
  221.     address voicemail1 'getLogEntryVar' variable ',' || logNumber || ',' || logEntryNumber
  222.     return result
  223.  
  224. getNumVoiceMessages: procedure expose status. mode.
  225.     if arg() ~= 1 then do
  226.         say 'Bad arguments to getNumVoiceMessages'
  227.         return 'BADBADBAD'
  228.     end
  229.     parse arg logNumber
  230.     address voicemail1 'getNumVoiceMessages' logNumber
  231.     return result
  232.  
  233. recordVoice:  procedure expose status. mode.
  234.     parse arg fileName
  235.     address voicemail1 'recordVoice' fileName
  236.     return rc
  237.  
  238. password: procedure expose status. mode.
  239.     address voicemail1 'password'
  240.     return result
  241.  
  242. hasFax: procedure expose status. mode.
  243.     address voicemail1 'hasfax'
  244.     return result
  245.  
  246. playBeep:  procedure expose status. mode.
  247.     parse arg tone1, tone2, duration
  248.     address voicemail1 'playBeep' tone1 ',' tone2 ',' duration
  249.     return rc
  250.  
  251. readNKeys:  procedure expose status. keys mode.
  252.     parse arg numKeys, timeOut
  253.     address voicemail1 'readNKeys' numKeys ',' timeOut
  254.     if rc = status.normal then keys = result
  255.     return rc
  256.  
  257. read1Key:  procedure expose status. key mode.
  258.     parse arg timeOut
  259.     address voicemail1 'read1Key' timeOut
  260.     if rc = status.normal then key = result
  261.     return rc
  262.  
  263. readKeysUntil: procedure expose status. keys mode.
  264.     parse arg terminatingCharacter, maxCharacters, timeOut
  265.     address voicemail1 'readKeysUntil' terminatingCharacter ',' maxCharacters ',' timeOut
  266.     if rc = status.normal then keys = result
  267.     return rc
  268.  
  269. readLine: procedure expose status. line mode.
  270.     parse arg timeOut
  271.     address voicemail1 'readLine' timeOut
  272.     if rc = status.normal then line = result
  273.     return rc
  274.  
  275. quickATCommand: procedure expose status. mode.
  276.     parse arg command, timeout, errorLine
  277.     if arg(2, 'o') then timeout = 5
  278.     if arg(3, 'o') then errorLine = 'ERROR'
  279.  
  280.     rc = writeLine(command)
  281.     if rc ~= status.normal then return rc
  282.     rc = readLine(timeout)
  283.     if rc ~= status.normal then return rc
  284.     rc = readLine(timeout)
  285.     if line = errorLine then return status.error
  286.     return rc
  287.  
  288. writeLine: procedure expose status. mode.
  289.     parse arg line
  290.     address voicemail1 'writeLine' line
  291.     return rc
  292.  
  293. /* the 'assumeUnknownMode' is to make sure that any use of a voice command WILL
  294.     cause ZVM to hang up the line, reset the modem, then do its stuff */
  295.  
  296. dropLine: procedure expose status. mode.
  297.     address voicemail1 'requireMode' mode.commandMode
  298.     address voicemail1 'assumeUnknownMode'
  299.     return rc
  300.  
  301. atCommands: procedure expose status. mode.
  302.     address voicemail1 'requireMode' mode.connectedMode
  303.     address voicemail1 'assumeUnknownMode'
  304.     return rc
  305.  
  306. requireDevice: procedure expose status. mode.
  307.     parse arg device
  308.     address voicemail1 'requireDevice' device
  309.     return rc
  310.  
  311. requireCompression: procedure expose status. compression.
  312.     parse arg compression
  313.     address voicemail1 'requireCompression' compression
  314.     return rc
  315.  
  316. requireMode: procedure expose status. mode.
  317.     parse arg mode
  318.     address voicemail1 'requireMode' mode
  319.     return rc
  320.  
  321. assumeMode: procedure expose status. mode.
  322.     parse arg mode
  323.     address voicemail1 'assumeMode' mode
  324.     return rc
  325.  
  326. assumeUnknownMode: procedure expose status. mode.
  327.     address voicemail1 'assumeUnknownMode'
  328.     return rc
  329.  
  330. distinctiveRing: procedure expose status. mode.
  331.     address voicemail1 'distinctiveRing'
  332.     return result
  333.  
  334. currentCIDName: procedure expose status. mode.
  335.     address voicemail1 'currentCIDName'
  336.     return result
  337.  
  338. currentCIDNumber: procedure expose status. mode.
  339.     address voicemail1 'currentCIDNumber'
  340.     return result
  341.  
  342. fileType: procedure expose status. mode.
  343.     parse arg filename
  344.     address voicemail1 'filetype' filename
  345.     return result
  346.  
  347. /* handshaking = 1 if you want 7 wire handshaking, handshaking = 2 if you
  348.     want xon/xoff handshaking */
  349. changeSerialParameters: procedure expose status. mode.
  350.     parse arg bps, bits, stop, handshaking
  351.     address voicemail1 'setserial' bps ',' bits ',' stop ',' handshaking
  352.     return rc
  353.  
  354. /* this is mainly for fax mode */
  355. use19200: procedure expose status. mode.
  356.     call changeSerialParameters(19200, 8, 1, 1)
  357.     address voicemail1 'assumeUnknownMode'
  358.     return rc
  359.  
  360. flushPhoneBuffer:  procedure expose status. mode.
  361.     address voicemail1 'flushPhoneBuffer'
  362.     return status.normal
  363.  
  364. listen: procedure expose status. mode.
  365.     address voicemail1 'listen'
  366.     return status.normal
  367.  
  368. answerFax: procedure expose status. mode.
  369.     address rexx 'handleFax'
  370.     return rc
  371.  
  372. cTime: procedure expose status. now mode.
  373.     address voicemail1 'ctime'
  374.     return result
  375.  
  376. displayError: procedure expose status. mode.
  377.     parse arg error
  378.     address voicemail1 'displayError' error
  379.     return status.normal
  380.  
  381. displayStatus: procedure expose status. mode.
  382.     parse arg status
  383.     address voicemail1 'displayStatus' status
  384.     return status.normal
  385.  
  386. displayMessage: procedure expose status. mode.
  387.     parse arg message
  388.     address voicemail1 'displayMessage' message
  389.     return status.normal
  390.  
  391. /* Effectively unlistens also! */
  392. setLastError: procedure expose status. mode.
  393.     parse arg status, error
  394.     address voicemail1 'setLastError' status ',' error
  395.     return status.normal
  396.  
  397. showDebugger: procedure
  398.     parse arg debuggerInfo
  399.     
  400.     firstLine = sourceline(1)
  401.     parse var firstLine '/*' title '*/'
  402.     if showlist('p', 'DEBUGGERLOGGER1') then
  403.         address debuggerLogger1 'e' title ':' debuggerInfo
  404.     else
  405.         say title ':' debuggerInfo
  406.     return
  407.  
  408. /*-----------------------------------------------------------------------*/
  409. /*                         signal processing                             */
  410. error:
  411.     call showDebugger("Error" rc "at line" sigl)
  412.     exit 20
  413.  
  414. break_c:
  415. halt:
  416.     call showDebugger("Halt/Break_C at line" sigl)
  417.     exit 20
  418.  
  419.  
  420. novalue:
  421.     call showDebugger("No value at line" sigl)
  422.     exit 20
  423.  
  424. syntax:
  425.     call showDebugger("Syntax error" rc "at line" sigl)
  426.     exit 20
  427.  
  428.  
  429. /* Initialize everything needed to communicate correctly with ZVM */
  430. doInitializations: procedure expose compression. mode. status. device. type. log.
  431.  
  432. log.incomingLog = 0
  433. log.archiveLog = 1
  434. log.outgoingLog = 2
  435. log.outgoingArchiveLog = 3
  436.  
  437. /* compressions */
  438. compression.ADPCM2 = 2
  439. compression.ADPCM3 = 3
  440. compression.CELP = 1
  441.  
  442. /* devices */
  443. device.telephoneLine = 2
  444. device.externalMic = 8
  445. device.internalSpeaker = 16
  446.  
  447. /* file types */
  448. type.unknownFile = 0
  449. type.zvmRawFile = 1
  450. type.zyxelFile = 2
  451. type.iffFaxFile = 3
  452. type.iff8svxFile = 4
  453.  
  454. /* modem modes */
  455. mode.unknownMode = -1
  456. mode.commandMode = 0
  457. mode.voiceMode = 1
  458. mode.connectedMode = 2
  459. mode.playMode = 3
  460. mode.recordMode = 4
  461.  
  462. /* return statuses from the various commands */
  463. status.normal = 0
  464. status.keyDetected = 1
  465. status.quietDetected = 2
  466. status.silenceDetected = 3
  467. status.faxDetected = 4
  468. status.busyDetected = 5
  469. status.timedOut = 6
  470. status.signalDetected = 7
  471. status.overflow = 8
  472. status.error = 9
  473.  
  474. call addlib("rexxsupport.library", 0, -30, 0)
  475.  
  476. return
  477.